﻿/****************************************************************************
** file: convert.h
** brief: cv::Mat 与 QImage 之间的转换函数。在 Qt 程序中使用 OpenCV 时有用。
** Copyright (C) LiYuan
** Author: LiYuan
** E-Mail: 18069211#qq(.)com
** Version 2.0.1
** Last modified: 2019.01.11
** Modified By: LiYuan
****************************************************************************/


#ifndef QT_OPENCV_CONVERT_H
#define QT_OPENCV_CONVERT_H

#include <QtCore/QDebug>
#include <QtGui/QImage>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/opencv.hpp"
/**
 * @brief 将 OpenCV 的 cv::Mat 类型图像转换为 QImage 类型
 * @param mat 待转换的图像，支持 CV_8UC1、CV_8UC3、CV_8UC4 三种OpenCV 的数据类型
 * @param clone true 表示与 Mat 不共享内存，更改生成的 mat 不会影响原始图像，false 则会与 mat 共享内存
 * @param rb_swap 只针对 CV_8UC3 格式，如果 true 则会调换 R 与 B RGB->BGR，如果共享内存的话原始图像也会发生变化
 * @return 转换后的 QImage 图像
*/
QImage cvMat2QImage(const cv::Mat& mat, bool clone = true, bool rb_swap = true);

/**
 * @brief 将 QImage 的类型图像转换为 cv::Mat 类型
 * @param image 待转换的图像，支持 Format_Indexed8/Format_Grayscale、24 位彩色、32 位彩色格式，
 * @param clone true 表示与 QImage 不共享内存，更改生成的 mat 不会影响原始图像，false 则会与 QImage 共享内存
 * @param rg_swap 只针对 RGB888 格式，如果 true 则会调换 R 与 B RGB->BGR，如果共享内存的话原始图像也会发生变化
 * @return 转换后的 cv::Mat 图像
*/
cv::Mat QImage2cvMat(const QImage &image, bool clone = false, bool rb_swap = true);


bool colorImage2GrayImage(const cv::Mat &inImage, cv::Mat &outImage);

/**
 * @brief extractPoints 提取图像中的非零点
 * @param grayEdgeImage 输入图像，单通道灰度图。通常是边缘检测后的图像。
 * @param points 返回图像中所有非零点的坐标
 * @param roi
 * @return
 */
bool extractPoints(const cv::Mat &grayEdgeImage, std::vector<cv::Point2i> &points, cv::Rect roi = cv::Rect());


QDebug operator<<(QDebug dbg, const cv::Point &p);
QDebug operator<<(QDebug dbg, const cv::Point2d &p);
QDebug operator<<(QDebug dbg, const cv::Point2f &p);
QDebug operator<<(QDebug dbg, const cv::Point2l &p);
QDebug operator<<(QDebug dbg, const cv::Scalar &s);
QDebug operator<<(QDebug dbg, const cv::Rect &r);
QDebug operator<<(QDebug dbg, const cv::Size &s);
QDebug operator<<(QDebug dbg, const cv::Matx22d &m);

#endif
